/**
 * 
 */
package org.yelongframework.json.gson.adapter;

import java.io.IOException;

import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

/**
 * 类型适配器
 * 
 * @since 1.0.0
 */
public class ClassTypeAdapter extends TypeAdapter<Class<?>> {

	private static final Logger log = LoggerFactory.getLogger(ClassTypeAdapter.class);

	/** 忽略未定义的类型 */
	private boolean ignoreNotFoundClass = true;

	// ==================================================构造器==================================================

	public ClassTypeAdapter() {
	}

	// ==================================================忽略未定义的类型==================================================

	/**
	 * @return 是否忽略未定义的类型
	 */
	public boolean isIgnoreNotFoundClass() {
		return ignoreNotFoundClass;
	}

	/**
	 * @param ignoreNotFoundClass 是否忽略未定义的类型
	 */
	public void setIgnoreNotFoundClass(boolean ignoreNotFoundClass) {
		this.ignoreNotFoundClass = ignoreNotFoundClass;
	}

	// ==================================================写==================================================

	@Override
	public void write(JsonWriter out, Class<?> value) throws IOException {
		// json为java类全名称 java.lang.String
		out.value(value.getName());
	}

	// ==================================================读==================================================

	@Override
	public Class<?> read(JsonReader in) throws IOException {
		if (in.peek() == JsonToken.NULL) {
			in.nextNull();
			return null;
		}
		String str = in.nextString();
		if (StringUtils.isBlank(str)) {
			return null;
		}
		try {
			return ClassUtils.getClass(str);
		} catch (ClassNotFoundException e) {
			if (isIgnoreNotFoundClass()) {
				log.debug("json转换为class类型异常，类型未定义", e);
				in.nextNull();
				return null;
			} else {
				throw new IOException(e);
			}
		}
	}

}
